/*
* Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.sxp.core.handler;
import com.google.common.base.Preconditions;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelInboundHandler;
import io.netty.channel.ChannelOutboundHandler;
import io.netty.handler.codec.bytes.ByteArrayEncoder;
import java.util.ArrayDeque;
import java.util.Deque;
/**
* HandlerFactory class represent unification for decoders and encoders used
*/
public final class HandlerFactory {
protected Deque<ChannelInboundHandler> decoders = new ArrayDeque<>();
protected Deque<ChannelOutboundHandler> encoders = new ArrayDeque<>();
public static HandlerFactory instanceAddDecoder(ChannelInboundHandler decoder, Position pos) {
return new HandlerFactory().addDecoder(decoder, pos);
}
public static HandlerFactory instanceAddEncoder(ChannelOutboundHandler encoder, Position pos) {
return new HandlerFactory().addEncoder(encoder, pos);
}
public synchronized HandlerFactory addDecoder(ChannelInboundHandler decoder, Position pos) {
Preconditions.checkNotNull(decoder);
Preconditions.checkNotNull(pos);
if (Position.End.equals(pos)) {
decoders.addLast(decoder);
} else {
decoders.addFirst(decoder);
}
return this;
}
public synchronized HandlerFactory addEncoder(ChannelOutboundHandler encoder, Position pos) {
Preconditions.checkNotNull(encoder);
Preconditions.checkNotNull(pos);
if (Position.End.equals(pos)) {
encoders.addLast(encoder);
} else {
encoders.addFirst(encoder);
}
return this;
}
/**
* @return Gets all decoders
*/
public synchronized ChannelHandler[] getDecoders() {
decoders.addFirst(new LengthFieldBasedFrameDecoderImpl());
ChannelHandler[] out = decoders.toArray(new ChannelHandler[decoders.size()]);
decoders.pollFirst();
return out;
}
/**
* @return Gets all encoders
*/
public synchronized ChannelHandler[] getEncoders() {
encoders.addFirst(new ByteArrayEncoder());
ChannelHandler[] out = encoders.toArray(new ChannelHandler[encoders.size()]);
encoders.pollFirst();
return out;
}
public enum Position {Begin, End}
}